package br.os.view;

import java.io.InputStream;
import java.util.Vector;

import br.os.communication.CommConsultarOS;
import br.os.communication.CommEnviarOS;
import br.os.communication.CommNotificador;
import br.os.exception.ExceptionDeleteObject;
import br.os.exception.ExceptionListObject;
import br.os.exception.ExceptionSaveObject;
import br.os.model.Message;
import br.os.model.OSFacade;
import br.os.model.Ordem;
import br.os.util.Util;
import br.os.xml.XMLConvert;

import com.sun.lwuit.CheckBox;
import com.sun.lwuit.Command;
import com.sun.lwuit.Dialog;
import com.sun.lwuit.Form;
import com.sun.lwuit.events.ActionEvent;
import com.sun.lwuit.events.ActionListener;
import com.sun.lwuit.layouts.BoxLayout;
/**
 * OSManager
 * @author Rubean, Roberto, Rafael
 */
public class OSManager extends Form implements ActionListener, CommNotificador {

	private Command cmdVoltar       = new Command("Voltar");
	private Command cmdAtualizar    = new Command("Atualizar");
	private Command cmdEfetuarBaixa = new Command("Efetuar Baixa");
	private OSMenu osMenu;
	private String tecnico;
	private String urlConsulta      = "http://" + Util.getServerHost() + ":" + Util.getServerPort() + "/OSWeb/Consultar";
	private String urlBaixa         = "http://" + Util.getServerHost() + ":" + Util.getServerPort() + "/OSWeb/Baixar";
	private Vector ordens;
	private Vector checkBox;
	private boolean efetuandoBaixa = false;

	/**
	 * OSManager
	 */
	public OSManager(OSMenu osMenu, String tecnico) {
		super("Gerenciar OS");
		setLayout(new BoxLayout(BoxLayout.Y_AXIS));
		checkBox = new Vector();
		this.osMenu = osMenu;
		this.tecnico = tecnico;
		addCommand(cmdVoltar);
		addCommand(cmdAtualizar);
		addCommand(cmdEfetuarBaixa);
		
		addCommandListener(this);
		setScrollableY(true);
		carregarOrdens();
	}

	/**
	 * actionPerformed
	 */
	public void actionPerformed(ActionEvent event) {
		Object source = event.getSource();
		if (cmdVoltar.equals(source)) {
			osMenu.show();
		} else if (cmdAtualizar.equals(source)) {
			CommConsultarOS consulta = new CommConsultarOS(urlConsulta, tecnico, this);
			consulta.start();
		} else if (cmdEfetuarBaixa.equals(source)) {
			baixarOrdens();
		}
		this.refreshTheme();
	}

	/**
	 * notificarException
	 */
	public void notificarException(Exception exception) {
		exception.printStackTrace();
		 Dialog.show("Gerenciar OS", exception.getMessage(), "Ok", null);
	}

	/**
	 * notificarInputStream
	 */
	public void notificarInputStream(InputStream in) {
		Vector lordens;
		lordens = XMLConvert.XMLtoObject(in);
		if (lordens.size() > 0) {
			/*Tratamento para objetos do tipo Ordem*/
			if (lordens.elementAt(0) instanceof Ordem) {
				for (int i = 0; i < lordens.size(); i++) {
					try {
						OSFacade.getInstance().save((Ordem) lordens.elementAt(i));
					} catch (ExceptionSaveObject e) {
						e.printStackTrace();
					}
				}
				carregarOrdens();
			} else if (lordens.elementAt(0) instanceof Message) {
				/*Tratamento para objetos do tipo Message*/
				Message message = (Message)lordens.elementAt(0);
				if (message.getCode().equals("0")){
					Dialog.show("Gerenciar OS", message.getMensagem(), "Ok", null);
					updateBaixa(true);
				}else{
					Dialog.show("Erro Gerenciar OS", message.getMensagem(), "Ok", null);
					updateBaixa(false);
				}
			}
			this.refreshTheme();
		}else{
		  Dialog.show("Gerenciar OS", "Sem resposta do Servidor", "Ok", null);
		}
	}
	/**
	 * Método responsavel por carregar os ordens 
	 */
	public void carregarOrdens() {
		try {
			this.removeAll();
			checkBox.removeAllElements();
			ordens = OSFacade.getInstance().listar(Ordem.class, null, null);
			Ordem ordem;
			for (int i = 0; i < ordens.size(); i++) {
				ordem = (Ordem) ordens.elementAt(i);
				checkBox.addElement(new CheckBox(String.valueOf(ordem.getId())+ ordem.getServico()));
				this.addComponent((CheckBox)checkBox.elementAt(i));
			}

		} catch (ExceptionListObject e) {
			e.printStackTrace();
		}
	}

	/**
	 * M�todo responsavel por realizar a baixa 
	 */
	public void baixarOrdens(){
		if((ordens!=null) && (ordens.size() > 0)){
			CheckBox checkBox;
			Vector ordensBaixa = new Vector();
			for (int i = 0; i < ordens.size(); i++) {
			  checkBox = (CheckBox) this.checkBox.elementAt(i);
			  if(checkBox.isSelected()){
			  	ordensBaixa.addElement(ordens.elementAt(i));
			  	checkBox.setEnabled(false);
			  }
			}
			if(!ordensBaixa.isEmpty()){
				CommEnviarOS commEnviarOS = new CommEnviarOS(urlBaixa, ordensBaixa, tecnico, this);
				efetuandoBaixa = true;
				commEnviarOS.start();
			}else{
				Dialog.show("Gerenciar OS", "Selecione as ordens a serem baixadas", "Ok", null);
			}
		}else {
			 Dialog.show("Gerenciar OS", "Não existem ordens a serem baixadas", "Ok", null);
		}
	}
	/**************************************************************/
	public void updateBaixa(boolean done){
		if(efetuandoBaixa){
			CheckBox check;
			for (int i = 0; i < ordens.size(); i++) {
				check = (CheckBox) this.checkBox.elementAt(i);
			  /*se done=true, atualiza a tela e deleta as ordens  baixadas*/
			  if(done){
			  	if(check.isSelected()){
			  		this.removeComponent(check);
			  		try {
			  			OSFacade.getInstance().delete((Ordem)ordens.elementAt(i));
			  		} catch (ExceptionDeleteObject e) {
			  			Dialog.show("Gerenciar OS", e.getMessage(), "Ok", null);
			  		}
			  	}
			  }else if(check.isSelected()){
			  	check.setEnabled(true);
			  }
			}
			/**Atualizando as ordens**/
			if(done){
				carregarOrdens();
			}
			efetuandoBaixa = false;
		}
	}
 /**************************************************************/
}
